#ifdef SU1
#define _GLIBCXX_DEBUG
#endif

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); i++)
#define forl(i, n) for (int i = 1; i <= int(n); i++)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; i--)
#define fore(i, l, r) for (int i = int(l); i <= int(r); i++)
#define pb(a) push_back(a)
#define mp(x, y) make_pair((x), (y))
#define sz(a) (int) (a).size()
#define all(a) (a).begin(), (a).end()
#define ft first
#define sc second
#define x first
#define y second

template<typename X> inline X abs(const X& a) { return a < 0 ? -a : a; }
template<typename X> inline X sqr(const X& a) { return a * a; }

typedef long long li;
typedef long double ld;
typedef pair<ld, ld> pt;

const int INF = int(1e9);
const li INF64 = li(1e18);
const ld PI = acosl(ld(-1));
const ld EPS = 1e-9;

pt operator -(const pt& a, const pt& b) {
	return pt(a.x - b.x, a.y - b.y);
}
pt operator +(const pt& a, const pt& b) {
	return pt(a.x + b.x, a.y + b.y);
}
pt operator *(const pt& a, const ld& k) {
	return pt(a.x * k,  a.y * k);
}
ld cross(const pt& a, const pt& b) {
	return a.x * b.y - a.y * b.x;
}

pt rot90(const pt& v) {
	return pt(-v.y, v.x);
}

ld inter(pt p1, pt v1, pt p2, pt v2) {
	// p1 + v1 * t - p2, v2 = 0;
	return cross(p2 - p1, v2) / cross(v1, v2);
}
pt interPos(pt p1, pt v1, pt p2, pt v2) {
	return p1 + v1 * inter(p1, v1, p2, v2);
}
pt mirror(pt p1, pt v1, pt p2, pt v2) {
	return p1 + v1 * (2 * inter(p1, v1, p2, v2));
}

char s[100500];

inline bool read()
{
	assert(scanf("%s", s) == 1);
	return strcmp(s, "#") != 0;
}

int pos;

enum {PNT,LINE};
struct any {
	int tp;
	pt p, v;
};

any f(const any& a, const any& b) {
	if (a.tp == PNT && b.tp == PNT) {
		any res;
		res.tp = LINE;
		res.p = a.p;
		res.v = b.p - a.p;
		return res;
	}
	if (a.tp == LINE && b.tp == LINE) {
		any res;
		res.tp = PNT;
		res.p = interPos(a.p, a.v, b.p, b.v);
		return res;
	}
	if (a.tp == PNT) {
		assert(b.tp == LINE);
		any res;
		res.tp = PNT;
		res.p = mirror(a.p, rot90(b.v), b.p, b.v);
		return res;
	}
	if (b.tp == PNT) {
		assert(a.tp == LINE);
		any res;
		res.tp = PNT;
		res.p = mirror(b.p, rot90(a.v), a.p, a.v);
		return res;
	}
	throw;
}

ld readNum() {
	int sign = 1;
	while (s[pos] == '-') {
		sign = -sign;
		pos++;
	}
	ld res = 0;
	while (isdigit(s[pos])) {
		res = res * 10 + (s[pos] - '0');
		pos++;
	}
	return res * sign;
}

any calc();

any un() {
	assert(s[pos] == '(');
   	pos++;
   	if (s[pos] == '-' || isdigit(s[pos])) {
   		any res;
   		res.tp = PNT;
   		res.p.x = readNum();
   		assert(s[pos] == ',');
   		pos++;
   		res.p.y = readNum();
   		assert(s[pos] == ')');
   		pos++;
   		return res;
   	}
   	any res = calc();
   	assert(s[pos] == ')');
   	pos++;
   	return res;
}

any calc() {
	any res = un();
	while (s[pos] == '@') {
		pos++;
		res = f(res, un());
	}
	return res;
}

inline void solve()
{
	pos = 0;
	any res = calc();
	assert(s[pos] == 0);
	assert(res.tp == PNT);
	printf("%.10lf %.10lf\n", double(res.p.x), double(res.p.y));
}

int main()
{
#ifdef SU1
	assert(freopen("input.txt", "rt", stdin));
//	assert(freopen("output.txt", "wt", stdout));
#endif

	cout << fixed << setprecision(10);
	cerr << fixed << setprecision(5);

	while(read())
		solve();
	
#ifdef SU1
	cerr << "=== TIME : " << clock() << " ===" << endl;
#endif
	return 0;
}
